Ukladani NULL hodnot do databaze pri prazdnem TDBEdit poli
Otázka od: Tomas Bradle
11. 5. 2004 22:54
Zdravim vsechny,
mam tu jeste jeden problemek. Mam TDBEdit komponenty napojene na TIBDataset.
V pripade editovani, kdyz se text z TDBEdit uplne vymaze (predtim tam nejaky
byl), nasledny POST ulozi do databaze hodnotu NULL. Jedna se o hodnotu typu
varchar.
Nevi nekdo jak tohle nejak jednoduse vyresit ?
diky
Tomas Bradle
t.bradle@worldonline.cz
Odpovedá: Lebeda David
12. 5. 2004 9:54
> mam tu jeste jeden problemek. Mam TDBEdit komponenty napojene na
> TIBDataset. V pripade editovani, kdyz se text z TDBEdit uplne vymaze
> (predtim tam nejaky byl), nasledny POST ulozi do databaze hodnotu
> NULL. Jedna se o hodnotu typu varchar.
>
> Nevi nekdo jak tohle nejak jednoduse vyresit ?
Ahoj,
to je asi dalsi z duvodu, proc k temhle vecem nepouzivat DBEdity. No ale zkusim
poradit tip - nevim, zda pomuze. Kdyz jsem se kdysi vrtal v TIBDatasetu, zdalo
se mi,
ze pro IB je zaveden novy typ fieldu pro retezce. Normalne se pouziva
TStringField. IBX
zavadi i typ TIBStringField a ten mozna zavadi to chovani, ktere popisujes.
Zkusil bych
tedy namisto IBStringFieldu pouzit StringField. Nebo se podivat do zdrojaku
IBX, zda
nekecam.
David Lebeda
Odpovedá: Tomas Bradle
12. 5. 2004 16:34
Tak jsem to predelal bez TDBEditu a vysledek je stejny: prazdny retezec v
TIBStringField znamena NULL v databazi. Data prirazuju normalne stylem
dsTest.insert;
dsTestPRIJMENI.AsString:='Novak';
dsTest.post;
Pro TIBTabel i pro TIBDataset. Jedine co napise spravne prazdny retezec do
databaze je TIBSQL, coz je logicke.
Neni na to v IBX nejaky "prepinac" ?
diky
Tomas Bradle
t.bradle@worldonline.cz
----- Original Message -----
From: "Lebeda David" <david.lebeda@comarr.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, May 12, 2004 10:48 AM
Subject: Re: Ukladani NULL hodnot do databaze pri prazdnem TDBEdit poli
> > mam tu jeste jeden problemek. Mam TDBEdit komponenty napojene na
> > TIBDataset. V pripade editovani, kdyz se text z TDBEdit uplne vymaze
> > (predtim tam nejaky byl), nasledny POST ulozi do databaze hodnotu
> > NULL. Jedna se o hodnotu typu varchar.
> >
> > Nevi nekdo jak tohle nejak jednoduse vyresit ?
>
> Ahoj,
>
> to je asi dalsi z duvodu, proc k temhle vecem nepouzivat DBEdity. No ale
zkusim
> poradit tip - nevim, zda pomuze. Kdyz jsem se kdysi vrtal v TIBDatasetu,
zdalo se mi,
> ze pro IB je zaveden novy typ fieldu pro retezce. Normalne se pouziva
TStringField. IBX
> zavadi i typ TIBStringField a ten mozna zavadi to chovani, ktere
popisujes. Zkusil bych
> tedy namisto IBStringFieldu pouzit StringField. Nebo se podivat do
zdrojaku IBX, zda
> nekecam.
>
> David Lebeda
>
>
Odpovedá: Lebeda David
13. 5. 2004 6:58
> Tak jsem to predelal bez TDBEditu a vysledek je stejny: prazdny
> retezec v TIBStringField znamena NULL v databazi. Data prirazuju
> normalne stylem
>
> dsTest.insert;
> dsTestPRIJMENI.AsString:='Novak';
> dsTest.post;
>
> Pro TIBTabel i pro TIBDataset. Jedine co napise spravne prazdny
> retezec do databaze je TIBSQL, coz je logicke.
>
> Neni na to v IBX nejaky "prepinac" ?
Na prepinac neverim. Ve verzi, kterou mam ja (a ktera neni pravda uplne
nejnovejsi), je
v metode TIBCustomDataSet.InternalSetFieldData toto:
if (Buffer = nil) or
(Field is TIBStringField) and (PChar(Buffer)[0] = #0) then
rdFields[FMappedFieldPosition[Field.FieldNo - 1]].fdIsNull := True
Coz znamena, ze pro prazdne retezce nahazuje priznak NULL. Reseni proto jsou:
1) Misto TIBStringField pouzivat TStringField. Coz by ale asi znamenalo fieldy
vytavret
rucne a to se ti asi nebude libit.
2) Nepouzivat fieldy k prirazovani hodnot. DBEdit i kod, ktery jsi uvedl
(Insert, uprava
fieldu, post) pracuji stejne a s IBDatasetem bez uprav se tomu nevyhnes.
3) Napsat si vlastni dataset, ktery by vysel z IBCustomDatasetu, ale metodu
InternalSetFieldData by implementoval lepe - je virtualni, teoreticky by to asi
slo. Ale ani
to by se ti jiste moc nelibilo.
4) Nejaka prasecinka typu, ze k projektu prilozis unitu IBCustomDataset a v ni
to primo
opravis.
5) Pro inserty a updaty nepouzivat vyse uvedeny postup, ale prime pouziti SQL
prikazu
insert nebo update. To jedine ti da snad jistotu, ze se provede opravdu jen to,
co v tom
prikazu vyslovene uvedes.
6) V uvahu by asi prichazelo i nejake osetreni v before triggerech na serveru -
ze kdyz
tam bude null, at do databaze zapise prazdny retezec...je-li to tedy vzhledem k
okolnostem pouzitelne.
7) Nejake jine reseni...???
David Lebeda